﻿#include <iostream>

using namespace std;

//继承与友元
//class Student;
//class Person
//{
//public:
//	friend void Display(const Person& p, const Student& s);
//protected:
//	string _name; // 姓名
//};
//
//class Student : public Person
//{
//protected:
//	int _stuNum; // 学号
//};
//
//void Display(const Person& p, const Student& s)
//{
//	cout << p._name << endl;
//	//基类的友元不能访问派生类的private和protected
//	//cout << s._stuNum << endl;
//}
//
//int main()
//{
//	Person p;
//	Student s;
//	Display(p, s);
//	return 0;
//}


//不能被继承的类
//class Base 
//{
//public:
//	void func5() { cout << "Base::func5" << endl; }
//private:
//	// C++98的方法
//	Base(int a)
//	{}
//	int a = 1;
//};
//
//class Derive :public Base
//{
//	void func4() { cout << "Derive::func4" << endl; }
//};


//class Base final
//{
//public:
//	void func5() { cout << "Base::func5" << endl; }
//
//};
//
//class Derive :public Base
//{
//	void func4() { cout << "Derive::func4" << endl; }
//};
//
//int main()
//{
//	Base b;
//	Derive d;
//	return 0;
//}


//class Person
//{
//public:
//	string _name;
//	static int _count;
//};
//
//int Person::_count = 0;
//
//class Student : public Person
//{
//protected:
//	int _stuNum;
//};


//int main()
//{
//	Person p;
//	Student s;
//	// 这里的运行结果可以看到非静态成员_name的地址是不⼀样的
//// 说明派生类继承了基类的非静态成员变量，派生类和基类的对象各有⼀份
//	//cout << &p._name << endl;
//	//cout << &s._name << endl;
//
//	//这里的运行结果可以看到静态成员_count的地址是⼀样的
//	// 说明派生类和基类共用同一份静态成员
//	cout << &p._count << endl;
//	cout << &s._count << endl;
//
//	//// 公有的情况下，父派生类指定类域都可以访问静态成员
//	//cout << Person::_count << endl;
//	//cout << Student::_count << endl;
//
//
//	return 0;
//}


//多继承及其菱形继承问题
//class Person
//{ public : string _name; };
//
//class Student :virtual public  Person
//{ protected: int _num;};
//
//class Teacher : virtual public Person
//{ protected : int _id; };
//
//class Assistant : public Student, public Teacher
//{ protected : string _majorCourse; };
//
//int main()
//{	
//	Assistant a;
//	// 编译报错：error C2385: 对“_name”的访问不明确
//	//a._name = "peter";
//	// 需要显示指定访问哪个基类的成员可以解决二义性问题，但是数据冗余问题无法解决
//	a.Student::_name = "xxx";
//	a.Teacher::_name = "yyy";
//	return 0;
//}


//class Person
//{
//public:
//	Person(const char* name)
//		:_name(name)
//	{}
//	string _name; // 姓名
//};
//class Student : virtual public Person
//{
//public:
//	Student(const char* name, int num)
//		:Person(name)
//		, _num(num)
//	{
//	}
//protected:
//	int _num; //学号
//};
//class Teacher : virtual public Person
//{
//public:
//	Teacher(const char* name, int id)
//		:Person(name)
//		, _id(id)
//	{
//	}
//protected:
//	int _id; // 职⼯编号
//};
//// 不要去玩菱形继承
//class Assistant : public Student, public Teacher
//{
//public:
//	Assistant(const char* name1, const char* name2, const char* name3)
//		:Person(name3)
//		, Student(name1, 1)
//		, Teacher(name2, 2)
//	{
//		//_name = "xiaowamg";
//	}
//protected:
//	string _majorCourse; // 主修课程
//};
//int main()
//{
//	// 思考⼀下这⾥a对象中_name是"张三", "李四", "王五"中的哪⼀个？
// 是王五，只有一个_name，"王五"是最后一次赋值
//	Assistant a("张三", "李四", "王五");
//	cout << &a._name << endl;
//	cout << &a.Person::_name << endl;
//	cout << &a.Student::_name << endl;
//	cout << &a.Teacher::_name << endl;
//	return 0;
//}